<?php

/**
 * Lord_View_Helper_Nav
 *
 * Хэлпер для отображения меню магазина и путевой навигации
 * Сделан два-в-одном, чтоб меньше запросов к базе было
 * Скоро тут появится карта сайта
 *
 * @author Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class Lord_View_Helper_Nav extends Zend_View_Helper_Abstract
{
	private static $tree;

/*------------------------------------------------------------------------------*/

	/**
	* Метод для построения меню или путевой нафигации
	*
	* @param string $type
	*/

	public function nav($type = 'menu', $cid = 0)
	{
		$model = new Store();

		// получаем данные для дерева
		$items = $model->getAllCategories()->toArray();
		$tree = (!isset($this->tree))
			  ? $this->tree = $this->makeTree($items)
			  : $this->tree;

		// получаем айдишник категории
		$eng = $this->view->getEngine();
		$cid = $eng->getParam('cid');
		if($cid == null)
		{
			//$id = (int)$eng->getParam('id');
			$url = $eng->getParam('url');
			if($url != null)
			{
				//$good = $model->getGood($id);
				$good = $model->getGoodByUrl($url);
				$cid = $good->cid;
			}
			else $cid = 0;
		}

		$path = $this->_getParents($items, $cid);
		$path = array_reverse($path);


		// в зависимости от типа что-нибудь возвращаем
		if($type == 'menu')
		{
			return $this->_renderMenu($tree, $path, $cid);
		}
		elseif($type == 'path')
		{
			$return = (isset($good))
					? $this->_renderPath($path, $good)
					: $this->_renderPath($path);
			return $return;
		}
	}

/*------------------------------------------------------------------------------*/

	public function makeTree($lineArray = array(), $parentId = 0, $treeArray = array())
	{
		foreach($lineArray as $item)
		{
			if($parentId == $item['pid'])
			{
				$treeArray[] = array (
					'label'      => $item['name'],
					'url'        => $item['url'],
					'module'     => 'store',
					'controller' => 'goods',
					'action'     => 'index',
					'id'         => $item['id'],
					'pid'        => $item['pid'],
					'params'     => array('cid' => $item['id']),
					'id' => $item['id'],
					'pid' => $item['pid'],
					'pages' => $this->makeTree($lineArray, $item['id'])
				);
			}
		}
		return $treeArray;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Метод для получения массива навигации
	* Потом используется для построения меню и путевой навигации
	* По-хорошему метод должен быть приватным, но для использования кэширования
	* нам он нужен как публичный
	*
	* @param int $id
	* @param int $level
	* @return array
	*/

	public function getTree($model = null, $id = 0, $level = 0)
	{
		$treeArr = array();
		// получаем данные для дерева категорий и преобразовываем в массив
		$tree = $model->getChildren($id)->toArray();

		foreach($tree as $k => $v)
		{
			$treeArr[$k]['label']      = $v['name'];
			$treeArr[$k]['module']     = 'store';
			$treeArr[$k]['controller'] = 'goods';
			$treeArr[$k]['action']     = 'index';
			$treeArr[$k]['id']         = $v['id'];
			$treeArr[$k]['pid']        = $v['pid'];
			$treeArr[$k]['params']     = array('cid' => $v['id']);
			// рекурсивно вызываем функцию
			$node =  $this->getTree($model, $v['id'], $level + 1);
			if (!empty($node)) {
				$treeArr[$k]['pages'] = $node;
			}
		}
		// возвращаем результат
		return $treeArr;
	}

/*==============================================================================*/

	/**
	 * Категории, по которым прошел юзер
	 * Рекурсивно достаются из базы.
	 * Данные возвращаются в виде массива
	 *
	 * @param $id int
	 * @param $level int
	 * @return array
	 */

	private function _getParents($items, $id = 0, $level=0)
	{
		static $parents = array();

		foreach($items as $k=>$item)
		{
			if($id == (int)$item['id'])
			{
				$parents[$k]['id']   = $item['id'];
				$parents[$k]['name'] = $item['name'];
				$this->_getParents($items, $item['pid']);
			}

		}
		return $parents;
		/*
		// статическая переменная для накопления дерева
		static $result = array();

		// получаем данные для дерева категорий и преобразовываем в массив
		$category = $model->getParent($id);

		if($category != null)
		{
			$result[$level]['id']   = $category['id'];
			$result[$level]['name'] = $category['name'];
			$this->_getParents($model, $category['pid'], $level + 1);
		}

		// возвращаем результат
		return $result;
		*/

	}

/*------------------------------------------------------------------------------*/

	private function _renderMenu($tree, $path, $cid)
	{
		?>
	<ul id="level_0">

		<?foreach($tree as $n1=>$level1):?>
		<li><a href="<?=$this->view->baseUrl?>store/goods/index/cid/<?=$level1['id']?>" id="<?=$level1['id']?>"><?=$level1['label']?></a></li>
			<?if(isset($level1['pages'])):?>
				<ul id="level_1">

					<?foreach($level1['pages'] as $n2=>$level2):?>
					<li><a href="<?=$this->view->baseUrl?>store/goods/index/cid/<?=$level2['id']?>" id="<?=$level2['id']?>"><?=$level2['label']?></a></li>
						<?if(isset($level2['pages'])):?>
								<ul id="level_2">

								<?foreach($level2['pages'] as $n3=>$level3):?>	
								<li><a href="<?=$this->view->baseUrl?>store/goods/index/cid/<?=$level3['id']?>" id="<?=$level3['id']?>"><?=$level3['label']?></a></li>
									<?if(isset($level3['pages'])):?>
										<ul id="level_3">

											<?foreach($level3['pages'] as $n4=>$level4):?>
												<li><a href="<?=$this->view->baseUrl?>store/goods/index/cid/<?=$level4['id']?>" id="<?=$level4['id']?>"><?=$level4['label']?></a></li>
													<?if(isset($level4['pages'])):?>
														<ul id="level_4">
															
															<?foreach($level4['pages'] as $n5=>$level5):?>
															<li><a href="<?=$this->view->baseUrl?>store/goods/index/cid/<?=$level5['id']?>" id="<?=$level5['id']?>"><?=$level4['label']?></a></li>
															<?endforeach;?>	
														</ul>
													<?endif?>
											<?endforeach;?>	
										</ul>
									<?endif?>
								<?endforeach;?>
								</ul>
							<?endif?>
					<?endforeach;?>	
				</ul>
			<?endif?>
		<?endforeach;?>
	</ul>
		<?
	}

/*------------------------------------------------------------------------------*/

	private function _renderPath($path = array(), $good = '')
	{
		$separator = ' <span style="font-size:1.5em;">&rarr;</span> ';
		$count = count($path);
		$i = 1;
		foreach($path as $p)
		{

			if($i != $count)
			{
				echo '<a href="'.$this->view->baseUrl.'store/goods/index/cid/'.$p['id'].'">'.$p['name'].'</a>';
				echo $separator;
			}
			else
			{
				echo '<a href="'.$this->view->baseUrl.'store/goods/index/cid/'.$p['id'].'">'.$p['name'].'</a>';
				if($good != '') echo $separator . $good->name;
			}
			$i = $i + 1;
		}
	}

/*------------------------------------------------------------------------------*/
}
